package main

import (
	"fmt"
	"sync"
	"sync/atomic"
)

// 原子计数器， Go 中管理状态的主要机制是通过通道进行通信。我们在工作池中看到了这一点。不过，还有其他一些管理状态的选项。在这里，我们将研究如何使用包来sync/atomic访问多个 goroutine 的原子计数器。
func main() {
	// 定义原子类型的int并发参数
	var ops atomic.Uint64

	// 定义WaitGroup是为啦等待所有的goroutine完成所有的工作
	var wg sync.WaitGroup

	// 创建50个协程，并发执行
	for i := 0; i < 50; i++ {
		// 表示并发执行啦一个goroutine，需要在任务组数量加一
		wg.Add(1)

		go func() {
			for c := 0; c < 1000; c++ {
				ops.Add(1)
			}
			// 表示goroutine执行结束，那么任务组数量减一
			wg.Done()
		}()
	}

	// 等待所有的goroutine执行结束
	wg.Wait()

	// 返回ops的值
	fmt.Println("ops:", ops.Load())
}
